g_mutex_init (&self->txn_stats_lock);
}
+/**
+ * ostree_repo_new:
+ * @path: Path to a repository
+ *
+ * Returns: (transfer full): An accessor object for an OSTree repository located at @path
+ */
OstreeRepo*
ostree_repo_new (GFile *path)
{
return g_object_new (OSTREE_TYPE_REPO, "path", path, NULL);
}
+
+/**
+ * ostree_repo_new_default:
+ *
+ * If the current working directory appears to be an OSTree
+ * repository, create a new #OstreeRepo object for accessing it.
+ * Otherwise, use the default system repository located at
+ * /ostree/repo.
+ *
+ * Returns: (transfer full): An accessor object for an OSTree repository located at /ostree/repo
+ */
+OstreeRepo*
+ostree_repo_new_default (void)
+{
+ if (g_file_test ("objects", G_FILE_TEST_IS_DIR)
+ && g_file_test ("config", G_FILE_TEST_IS_REGULAR))
+ {
+ gs_unref_object GFile *cwd = g_file_new_for_path (".");
+ return ostree_repo_new (cwd);
+ }
+ else
+ {
+ gs_unref_object GFile *default_repo_path = g_file_new_for_path ("/ostree/repo");
+ return ostree_repo_new (default_repo_path);
+ }
+}
+
/**
* ostree_repo_get_config:
* @self:
if (!g_file_test (gs_file_get_path_cached (self->objects_dir), G_FILE_TEST_IS_DIR))
{
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND,
"Couldn't find objects directory '%s'",
gs_file_get_path_cached (self->objects_dir));
goto out;
OstreeRepo* ostree_repo_new (GFile *path);
+OstreeRepo* ostree_repo_new_default (void);
+
gboolean ostree_repo_check (OstreeRepo *self, GError **error);
GFile * ostree_repo_get_path (OstreeRepo *self);
{ "checksum", ostree_builtin_checksum, OSTREE_BUILTIN_FLAG_NO_REPO },
{ "diff", ostree_builtin_diff, 0 },
{ "fsck", ostree_builtin_fsck, 0 },
- { "init", ostree_builtin_init, 0 },
+ { "init", ostree_builtin_init, OSTREE_BUILTIN_FLAG_NO_CHECK },
{ "log", ostree_builtin_log, 0 },
{ "ls", ostree_builtin_ls, 0 },
{ "refs", ostree_builtin_refs, 0 },
};
gboolean
-ostree_builtin_admin (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_admin (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
const char *opt_sysroot = "/";
}
gboolean
-ostree_builtin_cat (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_cat (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
int i;
const char *rev;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_object GOutputStream *stdout_stream = NULL;
gs_unref_object GFile *root = NULL;
gs_unref_object GFile *f = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc <= 2)
{
ot_util_usage_error (context, "An COMMIT and at least one PATH argument are required", error);
}
gboolean
-ostree_builtin_checkout (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_checkout (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
const char *commit;
const char *destination;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *existing_commit = NULL;
gs_free char *resolved_commit = NULL;
gs_free char *tmp_destination = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc < 2)
{
gchar *help = g_option_context_get_help (context, TRUE, NULL);
}
gboolean
-ostree_builtin_checksum (int argc, char **argv, GFile *repo_path_path, GCancellable *cancellable, GError **error)
+ostree_builtin_checksum (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
}
gboolean
-ostree_builtin_commit (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_commit (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
guint content_total = 0;
guint content_written = 0;
guint64 content_bytes_written = 0;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_object GFile *arg = NULL;
gs_free char *parent = NULL;
gs_free char *commit_checksum = NULL;
goto out;
}
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (!opt_branch)
{
g_set_error_literal (error, G_IO_ERROR, G_IO_ERROR_FAILED,
}
gboolean
-ostree_builtin_config (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_config (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context = NULL;
gboolean ret = FALSE;
const char *op;
const char *section_key;
const char *value;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *section = NULL;
gs_free char *key = NULL;
GKeyFile *config = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc < 2)
{
ot_util_usage_error (context, "OPERATION must be specified", error);
}
gboolean
-ostree_builtin_diff (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_diff (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
const char *src;
const char *target;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *src_prev = NULL;
gs_unref_object GFile *srcf = NULL;
gs_unref_object GFile *targetf = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc < 2)
{
gchar *help = g_option_context_get_help (context, TRUE, NULL);
}
gboolean
-ostree_builtin_fsck (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_fsck (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
GHashTableIter hash_iter;
gpointer key, value;
gboolean found_corruption = FALSE;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_hashtable GHashTable *objects = NULL;
gs_unref_hashtable GHashTable *commits = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (!opt_quiet)
g_print ("Enumerating objects...\n");
gboolean
-ostree_builtin_init (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_init (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context = NULL;
gboolean ret = FALSE;
const char *mode_str = "bare";
+ GFile *repo_path = NULL;
gs_unref_object GFile *child = NULL;
gs_unref_object GFile *grandchild = NULL;
- gs_unref_object OstreeRepo *repo = NULL;
GString *config_data = NULL;
context = g_option_context_new ("- Initialize a new empty repository");
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
+ repo_path = ostree_repo_get_path (repo);
+
child = g_file_get_child (repo_path, "config");
config_data = g_string_new (DEFAULT_CONFIG_CONTENTS);
if (!g_file_make_directory (child, NULL, error))
goto out;
- repo = ostree_repo_new (repo_path);
if (!ostree_repo_check (repo, error))
goto out;
gboolean
ostree_builtin_log (int argc,
char **argv,
- GFile *repo_path,
+ OstreeRepo *repo,
GCancellable *cancellable,
GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
const char *rev;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *checksum = NULL;
OstreeDumpFlags flags = OSTREE_DUMP_NONE;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (opt_raw)
flags |= OSTREE_DUMP_RAW;
}
gboolean
-ostree_builtin_ls (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_ls (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
- gs_unref_object OstreeRepo *repo = NULL;
const char *rev;
int i;
gs_unref_object GFile *root = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc <= 1)
{
ot_util_usage_error (context, "An COMMIT argument is required", error);
};
gboolean
-ostree_builtin_prune (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_prune (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *formatted_freed_size = NULL;
OstreeRepoPruneFlags pruneflags = 0;
gint n_objects_total;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (opt_refs_only)
pruneflags |= OSTREE_REPO_PRUNE_FLAGS_REFS_ONLY;
if (opt_no_prune)
}
gboolean
-ostree_builtin_pull_local (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_pull_local (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- data->dest_repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (data->dest_repo, error))
- goto out;
+ data->dest_repo = g_object_ref (repo);
if (argc < 2)
{
};
gboolean
-ostree_builtin_pull (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_pull (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
const char *remote;
OstreeRepoPullFlags pullflags = 0;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_ptrarray GPtrArray *refs_to_fetch = NULL;
context = g_option_context_new ("REMOTE [BRANCH...] - Download data from remote repository");
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc < 2)
{
ot_util_usage_error (context, "REMOTE must be specified", error);
};
gboolean
-ostree_builtin_refs (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_refs (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
const char *refspec_prefix = NULL;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_hashtable GHashTable *refs = NULL;
GHashTableIter hashiter;
gpointer hashkey, hashvalue;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc >= 2)
refspec_prefix = argv[1];
}
gboolean
-ostree_builtin_remote (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_remote (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
const char *op;
guint i;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_ptrarray GPtrArray *branches = NULL;
GKeyFile *config = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc < 2)
{
usage_error (context, "OPERATION must be specified", error);
gboolean
ostree_builtin_reset (int argc,
char **argv,
- GFile *repo_path,
+ OstreeRepo *repo,
GCancellable *cancellable,
GError **error)
{
gboolean ret = FALSE;
const char *ref;
const char *target = NULL;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free gchar *current = NULL;
gs_free gchar *checksum = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc <= 2)
{
ot_util_usage_error (context, "A ref and commit argument is required", error);
};
gboolean
-ostree_builtin_rev_parse (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_rev_parse (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
const char *rev = "master";
int i;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *resolved_rev = NULL;
gs_unref_variant GVariant *variant = NULL;
gs_free char *formatted_variant = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc < 2)
{
ot_util_usage_error (context, "REV must be specified", error);
}
gboolean
-ostree_builtin_show (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_show (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
const char *rev;
- gs_unref_object OstreeRepo *repo = NULL;
gs_free char *resolved_rev = NULL;
context = g_option_context_new ("OBJECT - Output a metadata object");
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
if (argc <= 1)
{
ot_util_usage_error (context, "An object argument is required", error);
}
gboolean
-ostree_builtin_trivial_httpd (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_trivial_httpd (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
gboolean ret = FALSE;
GOptionContext *context;
};
gboolean
-ostree_builtin_write_refs (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+ostree_builtin_write_refs (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
{
GOptionContext *context;
gboolean ret = FALSE;
GError *temp_error = NULL;
gsize len;
- gs_unref_object OstreeRepo *repo = NULL;
gs_unref_object GInputStream *instream = NULL;
gs_unref_object GDataInputStream *datastream = NULL;
gs_free char *line = NULL;
if (!g_option_context_parse (context, &argc, &argv, error))
goto out;
- repo = ostree_repo_new (repo_path);
- if (!ostree_repo_check (repo, error))
- goto out;
-
instream = (GInputStream*)g_unix_input_stream_new (0, FALSE);
datastream = g_data_input_stream_new (instream);
#pragma once
-#include <gio/gio.h>
+#include "ostree.h"
G_BEGIN_DECLS
-#define BUILTINPROTO(name) gboolean ostree_builtin_ ## name (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error)
+#define BUILTINPROTO(name) gboolean ostree_builtin_ ## name (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error)
BUILTINPROTO(admin);
BUILTINPROTO(cat);
#include <string.h>
+#include "ostree.h"
#include "ot-main.h"
#include "otutil.h"
#include "libgsystem.h"
OstreeCommand *command;
GError *error = NULL;
GCancellable *cancellable = NULL;
+ gs_unref_object OstreeRepo *repo = NULL;
const char *cmd = NULL;
- const char *repo = NULL;
- const char *host_repo_path = "/ostree/repo";
- GFile *repo_file = NULL;
+ const char *repo_arg = NULL;
gboolean want_help = FALSE;
gboolean skip;
int in, out, i;
}
else if (g_str_equal (argv[in], "--repo") && in + 1 < argc)
{
- repo = argv[in + 1];
+ repo_arg = argv[in + 1];
skip = TRUE;
in++;
}
else if (g_str_has_prefix (argv[in], "--repo="))
{
- repo = argv[in] + 7;
+ repo_arg = argv[in] + 7;
skip = TRUE;
}
else if (g_str_equal (argv[in], "--verbose"))
g_set_prgname (g_strdup_printf ("ostree %s", cmd));
- if (repo == NULL && !want_help &&
+ if (repo_arg == NULL && !want_help &&
!(command->flags & OSTREE_BUILTIN_FLAG_NO_REPO))
{
- if (g_file_test ("objects", G_FILE_TEST_IS_DIR)
- && g_file_test ("config", G_FILE_TEST_IS_REGULAR))
+ GError *temp_error = NULL;
+ repo = ostree_repo_new_default ();
+ if (!ostree_repo_check (repo, &temp_error))
{
- g_debug ("Assuming repo is in current directory");
- repo = ".";
- }
- else if (g_file_test (host_repo_path, G_FILE_TEST_EXISTS))
- {
- g_debug ("Assuming repo is at: %s", host_repo_path);
- repo = host_repo_path;
+ if (g_error_matches (temp_error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
+ {
+ g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
+ "Command requires a --repo argument");
+ g_error_free (temp_error);
+ ostree_usage (argv, commands, TRUE);
+ }
+ else
+ {
+ g_propagate_error (&error, temp_error);
+ }
+ goto out;
}
- else
+ }
+ else if (repo_arg)
+ {
+ gs_unref_object GFile *repo_file = g_file_new_for_path (repo_arg);
+ repo = ostree_repo_new (repo_file);
+ if (!(command->flags & OSTREE_BUILTIN_FLAG_NO_CHECK))
{
- g_debug ("Could not automatically determine --repo");
- g_set_error_literal (&error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Command requires a --repo argument");
- ostree_usage (argv, commands, TRUE);
- goto out;
+ if (!ostree_repo_check (repo, &error))
+ goto out;
}
}
-
- if (repo)
- repo_file = g_file_new_for_path (repo);
- if (!command->fn (argc, argv, repo_file, cancellable, &error))
+ if (!command->fn (argc, argv, repo, cancellable, &error))
goto out;
out:
- g_clear_object (&repo_file);
if (error)
{
g_propagate_error (res_error, error);
#pragma once
-#include <gio/gio.h>
+#include "ostree.h"
typedef enum {
OSTREE_BUILTIN_FLAG_NONE = 0,
- OSTREE_BUILTIN_FLAG_NO_REPO = 1,
+ OSTREE_BUILTIN_FLAG_NO_REPO = 1 << 0,
+ OSTREE_BUILTIN_FLAG_NO_CHECK = 1 << 1
} OstreeBuiltinFlags;
typedef struct {
const char *name;
- gboolean (*fn) (int argc, char **argv, GFile *repo_path, GCancellable *cancellable, GError **error);
+ gboolean (*fn) (int argc, char **argv, OstreeRepo *repo, GCancellable *cancellable, GError **error);
int flags; /* OstreeBuiltinFlags */
} OstreeCommand;